// crypto模块的目的是为了提供通用的加密和哈希算法
const crypto = require('node:crypto');

// 1、对称加密算法
// 双方协商定义一个秘钥以及 iv(向量)
// createCipheriv(algorithm, key, iv) 的三个参数
// 第一个参数：algorithm  接收一个算法， 通常使用 aes-256-cbc 的算法
// 第二个参数：key 就是秘钥  32位的
// 第三个参数：iv 初始化向量 支持16位的  作用：包装我们生成的秘钥串每次都是不一样的，秘钥串缺少位数，还可以进行补码的操作

let key = crypto.randomBytes(32)      // 使用crypto生成一个32位的随机字节

let iv = Buffer.from(crypto.randomBytes(16))       // Buffer.from是用来创建二进制数据的缓存区的，可以将其他类型转换为Buffer二进制，更toString对应，替代了以前的new Buffer

const cipher = crypto.createCipheriv('aes-256-cbc', key, iv)  // 创建加密实例

// 加密，并输出加密结果，使用16进制表示
cipher.update("kkddmsm", "utf-8", "hex")
const result = cipher.final("hex")           // 取结果
console.log(result);

// 解密， 使用相同的算法，相同的key, 相同的iv
const decipher = crypto.createDecipheriv('ase-256-cbc', key, iv)  // 创建解密实例
decipher.update(result, "hex", "utf-8")  // 位置调换了
console.log(decipher.final("utf-8"));

// 2.非对称加密
// 需要生成公钥和私钥，私钥不能公开，公钥对外公开
const {privateKey, publicKey} = crypto.generateKeyPairSync('rsa', {     // 使用rsa算法，生成公钥和私钥
    modulusLength: 2048,        // 长度越长越安全
})

// 使用公钥去加密
const encrypted = crypto.publicEncrypt(publicKey, Buffer.from('百炼成钢'))

console.log(encrypted.toString("hex"));  // 按16进制输出

// 使用私钥解密
const decrypted = crypto.privateDecrypt(privateKey, encrypted)
console.log(decrypted.toString());

// 3.哈希函数 hash
// 不能被解密，单向的不可逆的
// let hash = crypto.createHash('sha256') // 或者使用md5   sha256有128位，MD5是32位
let hash = crypto.createHash('md5')
hash.update('hahahahhah')
const hashResult = hash.digest('hex')
console.log(hashResult);